/*************************************************************************
    Projet  -  Sport Collectif pour Robots
                             -------------------
    Auteur  -  Maxime Swinnen
*************************************************************************/

#ifndef CONFIG_H_
#define CONFIG_H_


//------------------------------------------------------------------------
// Role de l'interface <config>
//	Contient les outils necessaires a l'execution
//	des differents modules.
//------------------------------------------------------------------------


//--------------------------------------------------- Interfaces utilisees
#ifdef __APPLE__	// mac
#include <opencv/openCV.h>
#endif

#ifdef __linux__	// gcc (egcs) on linux
#include <opencv.hpp>
#endif
#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <iostream>

using namespace log4cplus;

//------------------------------------------------------------- Constantes

//Traces
#define TRACE
#define TRACE_COM
//#define TRACE_COM

// Log
#define LOG_DEFAULT_LVL				INFO_LOG_LEVEL 			// {TRACE, DEBUG, INFO, WARN, ERROR, FATAL}_LOG_LEVEL
extern Logger loggerVision;
extern Logger loggerIA;
extern Logger loggerControle;
extern Logger loggerCom;


// Options CLI
#define HELP						"help"
#define HELP_SHORT					'h'
#define COMPORT1					"comPort1"
#define COMPORT2					"comPort2"
#define LOGLVL						"LOGLVL"
#define LOGLVL_SHORT				'l'
#define LOGLVL_VISION				"LOGLVL_VISION"
#define LOGLVL_IA					"LOGLVL_IA"
#define LOGLVL_CONTROL				"LOGLVL_CONTROL"
#define LOGLVL_COM					"LOGLVL_COM"
#define LOGLVL_MAIN					"LOGLVL_MAIN"

// Valeurs option LOGLVL
#define LOG_NONE					"NONE"
#define LOG_TRACE					"TRACE"
#define LOG_DEBUG					"DEBUG"
#define LOG_INFO					"INFO"
#define LOG_WARN					"WARN"
#define LOG_ERROR					"ERROR"
#define LOG_FATAL					"FATAL"

//Erreurs
#define PORT_UNKNOWN				"PORT_UNKNOWN"
#define ERROR_CMD_LINE_PARAM 		-1

//General
#define ROBOT_NUM					2
#define ROBOT_GAUCHE				0
#define ROBOT_DROITE				1


// Index des coordonnees
#define X 							0
#define Y 							1


//Manager de ressources
#define ACTIVER_CALCUL_VITESSES		1
#define TAILLE_HISTORIQUE_POSITION	5
#define RES_SLEEP_PERIODE			50						// en ms
#define RES_SLEEP_MICROSEC			RES_SLEEP_PERIODE*1000


//Robot
#define DIAMETRE_ROBOT				6 						// cm
#define DISTANCE_ROUES				5.23 					// distance entre les deux roues du robot (en cm)
#define MARGE_SECURITE				4						// cm
#define DISTANCE_TIR				7						// cm
#define CONST_ROTATION				653						// constante servant a definir la position a donner aux roues pour une rotation (en pulse/rad)
#define CM_TO_PULSE					125						// val : 125 / constante de conversion centimetres <-> pulses
// Added by MAtuchifra :
#define DISTANCE_TIR_LONG 9						// cm
#define DISTANCE_TIR_COURTE 5						// cm
#define DISTANCE_VERTICAL_TIR_LONG  5
#define DISTANCE_VERTICAL_TIR_COURTE -5
#define	DISTANCE_VERTICAL_TIR 0
// end add

//Controle
#define VITESSE_BOOST 				40						// Vitesse de charge des robots (utilisee pour les tirs)

#define COEF_P 						1.0						// Coefficient de la composante Proportionnelle
#define COEF_I 						1.0						// Coefficient de la composante Integrale
#define COEF_D 						0.5						// Coefficient de la composante Derivee

//#define ASSERVISSEMENT_ACTIF
#define PERIODE_CONTROLE 			250000					// Periode de controle (en microsecondes)
#define PERIODE_ASSERVISSEMENT		200000					// Periode d'asservissement (correspond a 5 calculs par seconde)
#define SEUIL_ORIENTATION 			0.95					// Seuil du cosinus(direction robot, objectif) au-dessus duquel on considere
															// que le robot est correctement oriente

#define SEUIL_DISTANCE 				5						// Seuil en metre en-dessous duquel on considere la distance comme nulle
#define DUREE_TIR 					1000000					// Duree du "boost" de vitesse du robot lors du tir (en microsecondes)
#define DELTA_DEFENSE 				2						// Difference de distance (en cm) a appliquer au robot en phase de defense
															// pour tenir compte de la longueur du bras
#define LONGUEUR_BRAS				5



// IA
#define IA_SEUIL_ENVOI_NVL_OBJ		4
#define IA_SEUIL_ABERRATION_BALLE 	0.98
#define IA_SEUIL_NVLLE_TRAJECTOIRE  3

#define PERIODE_MIN_ENVOI 			500 					// durée minimale entre deux envois de commandes (en ms)

#define ATTAQUE_GAUCHE				1						// Type Message Attaque Balle a gauche
#define ATTAQUE_DROITE				2						// Type Message Attaque Balle a droite
#define REPLACEMENT					3						// Type Message Replacement
#define DEFENSE						4						// Type Message Defense


// Vision
#define LONGUEUR_TERRAIN_IMAGE_Y  	700						// en pixels
#define LARGEUR_TERRAIN_IMAGE_X 	441						// en pixels
#define LONGUEUR_TERRAIN_Y  		165						// en cm
#define LARGEUR_TERRAIN_X 			104						// en cm
#define MOITIE_LONGUEUR_TERRAIN_Y  	LONGUEUR_TERRAIN_Y/2	// en cm
#define MOITIE_LARGEUR_TERRAIN_X 	LARGEUR_TERRAIN_X/2		// en cm
#define QUART_LONGUEUR_TERRAIN_Y  	LONGUEUR_TERRAIN_Y/4	// en cm
#define QUART_LARGEUR_TERRAIN_X 	LARGEUR_TERRAIN_X/4		// en cm
#define LIGNE_DE_BUT				13						// en cm


namespace scor
{
	typedef struct Position
	{
		cv::Vec2d coord;
		cv::Vec2d orientation;
		long timestamp;										// millisecondes
	} Position;

}


#endif // CONFIG_H_
